//
//  HMStatusDAL.swift
//  Weibo22
//
//  Created by Apple on 16/12/13.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit

//  删除缓存时间
let maxTimeInterVal: Double = 7 * 24 * 60 * 60


//  数据库访问层, 用于缓存数据和网络加载数据
class HMStatusDAL: NSObject {

    //  加载数据
    class func loadData(maxId: Int64, sinceId: Int64, callBack: @escaping ([[String: Any]])->Void) {
        
        //  1. 判断本地是否有新浪微博缓存数据
        let localArray = checkedCacheData(maxId: maxId, sinceId: sinceId)
        
        if localArray.count > 0 {
            //  2. 如果本地有缓存数据,那么直接返回本地缓存数据
            callBack(localArray)
            return
        }
       
        //  3. 如果本地没有缓存数据,那么直接从网络加载数据
        HMNetworkTools.sharedTools.requestStatus(maxid: maxId, sinceId: sinceId) { (response, error) in
            if error != nil {
                print(error!)
                callBack(localArray)
                return
            }
            //  代码执行到此表示数据请求成功
            let dic = response as! [String: Any]
            //  新浪微博数据
            let statusDicArray = dic["statuses"] as! [[String: Any]]
            //  4. 网络数据加载成功后缓存到本地
            cacheData(statusDicArray: statusDicArray)
            //  5. 缓存成功后,把网络请求的数据返回
            callBack(statusDicArray)
        }
        
        
        
        
        
        
        
    
    }
    //  检查本地是否有缓存数据
    class func checkedCacheData(maxId: Int64, sinceId: Int64) -> [[String: Any]] {
        //   SELECT * FROM statuses where statusid < 4052246372712128 and userid = 5826086647 order by statusid desc limit 20
        
        var sql = "SELECT status FROM statuses\n"
        
        if maxId > 0 {
            //  上拉加载
            sql += "where statusid < \(maxId)\n"
        } else {
            //  下拉刷新
            sql += "where statusid > \(sinceId)\n"
        }
        //  用户id
        let userid = HMUserAccountViewModel.sharedUserAccount.userAccount?.uid
        //  拼接用户id
        sql += "and userid = \(userid!)\n"
        //  拼接排序方式和最大返回条数
        sql += "order by statusid desc limit 20\n"
        
        //  执行sql
        let dicArray = SqliteManager.sharedManager.selectDicArray(sql: sql)
        
        var tempArray = [[String: Any]]()
        //  遍历数组,把微博二进制数据转成字典添加到数组里面
        for dic in dicArray {
            //  获取微博二进制数据
            let statusData = dic["status"] as! Data
            //  把二进制数据转成字典
            let statusDic = try! JSONSerialization.jsonObject(with: statusData, options: []) as! [String: Any]
            
            tempArray.append(statusDic)
        }
        
        return tempArray
        
    
    }
    
    
    
    //  缓存新浪微博数据
    class func cacheData(statusDicArray: [[String: Any]]) {
        //  定义sql
        //  判断表里面是否存在插入的数据,如果存在直接替换,否则插入数据
        let sql = "INSERT OR REPLACE INTO STATUSES(STATUSID, STATUS, USERID) VALUES(?, ?, ?)"
        
        //  登陆用户的id
        let userid = HMUserAccountViewModel.sharedUserAccount.userAccount?.uid
        //  使用事务执行sql语句
        SqliteManager.sharedManager.queue.inTransaction { (db, rollBack) in
            
            //  遍历数组字典,执行sql语句
            for statusDic in statusDicArray {
                //  获取新浪微博id
                let statusid = statusDic["id"] as! Int64
                //  把字典转成二进制插入到数据库表里面
                let statusData = try! JSONSerialization.data(withJSONObject: statusDic, options: [])
                
                //  执行sql
                let result = db?.executeUpdate(sql, withArgumentsIn: [statusid, statusData, userid!])
                if result == false {
                    //  回滚数据
                    rollBack?.pointee = true
                    break
                }
            
            }
            
            
            
        }
        
        
    
    }
    
    //  删除缓存数据
    class func clearCatchData() {
        
        let dt = DateFormatter()
        //  指定格式化方式
        dt.dateFormat = "yyyy-MM-dd HH:mm:ss"
        //  删除的缓存时间
        let maxTime = dt.string(from: Date().addingTimeInterval(-maxTimeInterVal))
        
        
        //  定义sql
        let sql = "DELETE FROM statuses where time < '\(maxTime)'"
        
        SqliteManager.sharedManager.queue.inDatabase { (db) in
            let result = db?.executeUpdate(sql, withArgumentsIn: nil)
            
            if result == true {
                print("缓存数据删除成功, 影响了\(db!.changes())条数据")
            } else {
                print("删除缓存数据失败")
            }
        }
        
    
    }
    
    
    
    
    
    
    
}
